package thread;
//为什么要使用 lambda 表达式
    //避免匿名内部类定义过多
    //可以让代码看起来更简洁
    //去掉了一堆没有意义的代码，只留下核心的代码
/**
 * @Author Janson
 * @Date 2022/2/25 10:26
 * @Version 1.0
 */
/**
 *函数式接口：
        *任何接口，如果只包含一个抽象方法，那么它就是一个函数式接口。
        *对于函数式接口，我们可以通过 lambda 表达式来创建该接口的对象，简化编程
 */
public class TestLambda {
    public static void main(String[] args) {
        //外部类实现接口
        Like1 like1 = new Like1();
        like1.lambda();
        //内部类实现接口
        Like2 like2 = new Like2();
        like2.lambda();

        //3.局部内部类
        class Like3 implements ILike{
            @Override
            public void lambda() {
                System.out.println("I like lambda3");
            }
        }
        Like3 like3 = new Like3();
        like3.lambda();
        /**
         * 匿名内部类与lambda表达式存在相似之处：
                * = 前边直接用 接口 创建对象，在 = 后边，不一样，
                *匿名内部类时 new 接口{ 重写接口中的方法};
                *lambda 表达式 是 ()->{需要执行的语句};
                *注意：两个类的 } 后边都由 ; ，不要忘记。
         */
         //4.匿名内部类，没有类名称，用接口进行创建
         ILike like4 =   new ILike() {
            @Override
            public void lambda() {
                System.out.println("I like lambda4");
            }
        };
        like4.lambda();
        //5.用lambda 表达式
        ILike like5 = () -> {
            System.out.println("I like lambda5");
        };
        like5.lambda();

    }
    //2.内部类
    static class Like2 implements ILike{
        @Override
        public void lambda() {
            System.out.println("I like lambda2");
        }
    }
}

//定义一个函数式接口
interface ILike{
    void lambda();
}
//1.实现类  外部类
class Like1 implements ILike{
    @Override
    public void lambda() {
        System.out.println("I like Lambda1");
    }
}

